// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/*@testedFeatures=inference*/
library test;

import 'dart:async';

typedef int IntToInt(int i);

IntToInt a() {
  return /*@ returnType=int* */ (/*@ type=int* */ x) => x;
}

Future<IntToInt> b() async {
  // TODO(paulberry): this is broken due to bug 29689.
  return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
}

Iterable<IntToInt> c() sync* {
  yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
}

Iterable<IntToInt> d() sync* {
  yield* /*@ typeArgs=(int*) ->* int* */ [
    /*@ returnType=int* */ (/*@ type=int* */ x) => x
  ];
}

Stream<IntToInt> e() async* {
  yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
}

Stream<IntToInt> f() async* {
  yield* new /*@ typeArgs=(int*) ->* int* */ Stream.fromIterable(
      /*@ typeArgs=(int*) ->* int* */ [/*@ returnType=int* */ (/*@ type=int* */ x) => x]);
}

main() {}
